import defineReactive from './defineReactive';
import { def } from './utils';
import { arrayMethods } from './array';
import observe from './observe';
import Dep from './Dep';

/**
 * 将一个正常的对象转换成每个层级的属性都是响应式的
 */
export default class Observer {
  constructor(value) {
    // 每一个observer的实例上，都有一个dep
    this.dep = new Dep();

    // def主要用于配置__ob__属性，不能枚举
    def(value, '__ob__', this, false);
    console.log('我是Observer构造器', value);
    if (Array.isArray(value)) {
      // 当值为数组时
      // 将当前value原型指向arrayMethods
      Object.setPrototypeOf(value, arrayMethods);
      this.observeArray(value);
    } else {
      // 为对象或其他时
      this.walk(value);
    }
  }
  // 遍历
  walk(value) {
    // 数据拦截
    for (let key in value) {
      defineReactive(value, key)
    }
  }
  observeArray(arr) {
    let l = arr.length;
    for (let i = 0; i < l; i++) {
      // 逐项进行observe
      observe(arr[i]);
    }
  }
}